#ifndef C3POM_PORTAL_H
#define C3POM_PORTAL_H
#include<omp.h>
#include<string>
#include"c3pom/object.h"
namespace c3pom
{
	class Portal;
	class PortalBlock
	{
		private:
			omp_lock_t lock;//锁
			std::string owner;//所有者，该portalblock的产生者
			std::string statu;//当前的状态：排队等待，正在处理，处理完成
			Object data;//请求处理的数据
			Object result;//处理完毕后的返回结果
			std::string timeStamp;//唯一标志，分为三部分，前面部分为生成时间，中间部分为此block的序列号（生成数量），后面部分为该block的内存地址。设计之初就用于标志block的唯一性，因此不会将来也不打算明确划分各部分的长度。自动生成
			Portal* resultPortal;//处理结果存放的portal
			//这里解释下结果的获取方式：
			//1,目标插件处理完毕数据后，会将数据结果挂到result上，并发送到该resultPortal指定的Portal中
			//2,如果发送方保留了该portalblock的副本，则可以直接读取--同时也可以避免在等待回执时，数据由于排队而产生的延迟。
			//3,如果目标插件处理完数据后，并不产生回执信息，那么这里的resultportal和result都将被忽略--具体行为由目标插件的实现决定
		public:
			PortalBlock(Object,std::string,Portal* resultPortal=NULL);
			//状态操作
			std::string getStatu();
			int setStatu(std::string);
			//数据获取
			Object getData();
			
			//结果获取与设置
			Object getResult();
			int setResult(Object);
			
			//回执portal
			Portal* getResultPortal();
			
			//时间戳
			std::string getTimeStamp();
			
			//所有者
			std::string getOwner();
	};

	class PortalBuf
	{
		public:
			virtual PortalBlock* pop()=0;
			virtual void push(PortalBlock*)=0;
			virtual int dataLength();
	};
	class Portal
	{
		private:
			friend class PortalManager;
			Portal();
			PortalBuf* portalBuf;
		public:
			int dataLength();
			void operator<<(PortalBlock*);
			void operator>>(PortalBlock*&);
	};
}
#endif
